package main

import (
	"fmt"
	"strconv"
)

func main() {
	num := 2
	res := findNum(num)
	print(res)
}

func findNum(num int) float32 {
	// 思路：贪心，逐步获取每个高位的值，确保平方不大于 num， 直到求取到三位小数

	// 使用stack来存储已经得到的值

	// 怎么确定小数点前后？ 先遍历求取小数点前的值, pre确定高位
	pre := 0
	for i := 0; i*i <= num; i++ {
		if i*i <= num {
			pre = i
		}
	}

	var stack []int

	// 贪心求取小数位
	for i := 0; i < 3; i++ {
		for j := 9; j >= 0; j-- {
			stack = append(stack, j)
			formatNum := combineNum(pre, stack)
			if formatNum*formatNum <= float32(num) {
				break
			} else { // 不符合，出栈
				stack = stack[:len(stack)-1]
			}
		}
	}
	return combineNum(pre, stack)
}

func combineNum(pre int, decimals []int) float32 {
	numsStr := fmt.Sprintf("%v.", pre)
	for _, d := range decimals {
		numsStr = fmt.Sprintf("%v%v", numsStr, d)
	}

	value, _ := strconv.ParseFloat(numsStr, 3)
	return float32(value)
}
